package com.ruoyi.common.utils;

import java.util.*;
import java.util.regex.Pattern;
import com.alibaba.fastjson2.JSONArray;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.spring.SpringUtils;

/**
 * 字典工具类
 * 
 * @author ruoyi
 */
public class DictUtils
{
    /**
     * 分隔符
     */
    public static final String SEPARATOR = ",";

    /**
     * 设置字典缓存
     * 
     * @param key 参数键
     * @param dictDatas 字典数据列表
     */
    public static void setDictCache(String key, List<SysDictData> dictDatas)
    {
        SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas);
    }

    /**
     * 获取字典缓存
     * 
     * @param key 参数键
     * @return dictDatas 字典数据列表
     */
    public static List<SysDictData> getDictCache(String key)
    {
        JSONArray arrayCache = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
        if (StringUtils.isNotNull(arrayCache))
        {
            return arrayCache.toList(SysDictData.class);
        }
        return null;
    }

    /**
     * 根据字典类型和字典值获取字典标签
     * 
     * @param dictType 字典类型
     * @param dictValue 字典值
     * @return 字典标签
     */
    public static String getDictLabel(String dictType, String dictValue)
    {
        if (StringUtils.isEmpty(dictValue))
        {
            return StringUtils.EMPTY;
        }
        return getDictLabel(dictType, dictValue, SEPARATOR);
    }

    /**
     * 根据字典类型和字典标签获取字典值
     * 
     * @param dictType 字典类型
     * @param dictLabel 字典标签
     * @return 字典值
     */
    public static String getDictValue(String dictType, String dictLabel)
    {
        if (StringUtils.isEmpty(dictLabel))
        {
            return StringUtils.EMPTY;
        }
        return getDictValue(dictType, dictLabel, SEPARATOR);
    }

    /**
     * 根据字典类型和字典值获取字典标签
     *
     * @param dictType 字典类型
     * @param dictValue 字典值
     * @param separator 分隔符
     * @return 字典标签
     */
    public static String getDictLabel(String dictType, String dictValue, String separator) {
        if (StringUtils.isEmpty(dictValue)) {
            return StringUtils.EMPTY;
        }

        List<SysDictData> datas = getDictCache(dictType);
        if (StringUtils.isNull(datas)) {
            return StringUtils.EMPTY;
        }

        Map<String, String> valueLabelMap = new HashMap<>();
        for (SysDictData data : datas) {
            valueLabelMap.put(data.getDictValue(), data.getDictLabel());
        }

        if (StringUtils.containsAny(separator, dictValue)) {
            StringJoiner dictLabel = new StringJoiner(separator);
            String[] values = dictValue.split(Pattern.quote(separator));
            for (String value : values) {
                String label = valueLabelMap.get(value);
                dictLabel.add(label);
            }
            return dictLabel.toString();
        } else {
            return valueLabelMap.getOrDefault(dictValue, StringUtils.EMPTY);
        }
    }

    /**
     * 根据字典类型和字典标签获取字典值
     *
     * @param dictType 字典类型
     * @param dictLabel 字典标签
     * @param separator 分隔符
     * @return 字典值
     */
    public static String getDictValue(String dictType, String dictLabel, String separator) {
        if (StringUtils.isEmpty(dictLabel)) {
            return StringUtils.EMPTY;
        }

        List<SysDictData> datas = getDictCache(dictType);
        if (StringUtils.isNull(datas)) {
            return StringUtils.EMPTY;
        }

        Map<String, String> labelValueMap = new HashMap<>();
        for (SysDictData data : datas) {
            labelValueMap.put(data.getDictLabel(), data.getDictValue());
        }

        if (StringUtils.containsAny(separator, dictLabel)) {
            StringJoiner values = new StringJoiner(separator);
            String[] labels = dictLabel.split(Pattern.quote(separator));
            for (String label : labels) {
                String value = labelValueMap.get(label);
                values.add(value);
            }
            return values.toString();
        } else {
            return labelValueMap.getOrDefault(dictLabel, StringUtils.EMPTY);
        }
    }

    /**
     * 根据字典类型获取字典所有值
     *
     * @param dictType 字典类型
     * @return 字典值
     */
    public static String getDictValues(String dictType)
    {
        StringJoiner propertyString = new StringJoiner(SEPARATOR);
        List<SysDictData> datas = getDictCache(dictType);
        if (StringUtils.isNull(datas))
        {
            return StringUtils.EMPTY;
        }
        for (SysDictData dict : datas)
        {
            propertyString.add(dict.getDictValue());
        }
        return propertyString.toString();
    }

    /**
     * 根据字典类型获取字典所有标签
     *
     * @param dictType 字典类型
     * @return 字典值
     */
    public static String getDictLabels(String dictType)
    {
        StringJoiner propertyString = new StringJoiner(SEPARATOR);
        List<SysDictData> datas = getDictCache(dictType);
        if (StringUtils.isNull(datas))
        {
            return StringUtils.EMPTY;
        }
        for (SysDictData dict : datas)
        {
            propertyString.add(dict.getDictLabel());
        }
        return propertyString.toString();
    }

    /**
     * 删除指定字典缓存
     * 
     * @param key 字典键
     */
    public static void removeDictCache(String key)
    {
        SpringUtils.getBean(RedisCache.class).deleteObject(getCacheKey(key));
    }

    /**
     * 清空字典缓存
     */
    public static void clearDictCache()
    {
        Collection<String> keys = SpringUtils.getBean(RedisCache.class).keys(CacheConstants.SYS_DICT_KEY + "*");
        SpringUtils.getBean(RedisCache.class).deleteObject(keys);
    }

    /**
     * 设置cache key
     * 
     * @param configKey 参数键
     * @return 缓存键key
     */
    public static String getCacheKey(String configKey)
    {
        return CacheConstants.SYS_DICT_KEY + configKey;
    }

    /**
     * 获取字典value与label映射的map集合
     *
     * @param type 字典类型
     * @return Map<String, String>
     */
    public static Map<String, String> getValueLabelMap(String type) {
        if (type == null || type.trim().isEmpty()) {
            return Collections.emptyMap();
        }
        List<SysDictData> dicts = DictUtils.getDictCache(type);
        if (dicts == null || dicts.isEmpty()) {
            dicts = new ArrayList<>();
        }
        Map<String, String> valueLabelMap = new HashMap<>();
        for (SysDictData dict : dicts) {
            valueLabelMap.put(dict.getDictValue(), dict.getDictLabel());
        }
        return valueLabelMap;
    }

}
